module zl_2346_3(clk,datain,codeout,sel,en1,en2);
input [7:0] datain;//输入数据
input clk;//时钟信号
input en1,en2;//控制数据输入信号
output reg[7:0] codeout;//七段数码管的输出
output reg[2:0] sel;//3-8译码器的输入

reg [8:0] A;//寄存器A存放部分积，初始值为0
reg [7:0] B,C;//寄存器B存放被乘数、寄存器C存放乘数
reg [2:0] CR;//乘法步数计数器
reg [3:0] H;//存放一个十六进制位
reg [15:0] s;//积
reg Pb,Pc;//被乘数和乘数的符号位
reg [7:0] Bin,Cin;  //被乘数和乘数的绝对值


always @(posedge clk)
	begin
	   //en1为1、en2为0时，输入被乘数
		if(en1&~en2)
			begin
			CR=3'd0; //乘法步数计数器初始值为0
			A[8:0]=9'd0; //存放部分积寄存器A初始为0
			Pb=datain[7];
			B[6:0]=datain[6:0];
			B[7]=1'b0;
			Bin[7:0]=datain[7:0];
			end
		//en1为0、en2为1时，输入乘数
		else if(~en1&en2)
			begin
			CR=3'd0; //乘法步数计数器初始值为0
			A[8:0]=9'd0; //存放部分积寄存器A初始为0
			Pc=datain[7];
			C[6:0]=datain[6:0];
			C[7]=1'b0;
			Cin[7:0]=datain[7:0];
			end
		//en1为1、en2为1时，进行乘法运算
		else if(en1&en2)
			begin
			if(CR<=6)
				begin
				if(C[0]==1)
					A=A+B;
				C=C>>1; //C往右移一位
				C[6]=A[0]; //A的最右一位移动到C的最左一位
				A=A>>1; //A往右移一位
				CR=CR+1; //移动一次加1
				if(CR==7)
					begin
					A[7]=0; //空出来的一位置0
					A[8]=Pb^Pc; //符号位
					s[15:7]=A[8:0];
					s[6:0]=C[6:0];
					end
            end
			end
			
		//轮流显示8位数码管
		sel=sel+1;
		if(sel>=8)
			sel=0;
			
		case(sel)			
			3'd0:H=Bin[7:4];
			3'd1:H=Bin[3:0];
			3'd2:H=Cin[7:4];
			3'd3:H=Cin[3:0];
			3'd4:H=s[15:12];
			3'd5:H=s[11:8];
			3'd6:H=s[7:4];
			3'd7:H=s[3:0];
		endcase
		
		//数码管显示
		case(H)
			4'h0: codeout=8'h3F;
			4'h1: codeout=8'h06;
			4'h2: codeout=8'h5B;
			4'h3: codeout=8'h4F;
			4'h4: codeout=8'h66;
			4'h5: codeout=8'h6D;
			4'h6: codeout=8'h7D;
			4'h7: codeout=8'h07;
			4'h8: codeout=8'h7F;
			4'h9: codeout=8'h6F;
			4'hA: codeout=8'h77;
			4'hB: codeout=8'h7C;
			4'hC: codeout=8'h39;
			4'hD: codeout=8'h5E;
			4'hE: codeout=8'h79;
			4'hF: codeout=8'h71;
			default: codeout=8'h00;
		endcase

	end
endmodule
